前面講過了和 golang 的比較,今天來講講和 Python 進行後端開發的比較
Python 作為一個知名度非常高的程式語言,也有許多人嘗試用 Python 來進行後端開發。
不過作為一個直譯式語言,我個人在語言選擇時,總是覺得很難得遇到首選是 Python 的場景。
因為,作為一個功能比較泛用的直譯式語言,當我今天需要快速開發時,我會優先想到使用專門針對網頁開發的 PHP。
在面對剛開始學習程式語言的新人時,我也可以避免掉對新人來說最棘手的環境建置問題,特別是使用哪個套件管理系統,或者使用哪個版本的 Python。
當我今天需要效能時,考慮到編譯式語言的效能通常比較好,我會往編譯式語言,像是 Kotlin 去思考。
所以,除非今天遇到的是人員能力的需求,比方說多數同事都已經會 Python。我覺得在哪個狀況,Python 都會是一個非首選的選項。
如果今天想開發比較完整的後端需求,Python 內蠻多人會選擇使用 Django
Django 作為一個完整的框架,有內建的 ORM 結構
使用方式上,由於有類別的概念,我們可以用 class 來定義資料結構,並且使用 ManyToManyField
進行定義
from django.db import models
class Course(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Student(models.Model):
name = models.CharField(max_length=100)
# 多對多關係
courses = models.ManyToManyField(Course, related_name="students")
def __str__(self):
return self.name
使用方式如下
math = Course.objects.create(name="數學")
english = Course.objects.create(name="英文")
alice = Student.objects.create(name="Alice")
bob = Student.objects.create(name="Bob")
# 設定多對多關聯
alice.courses.add(math, english) # Alice 選了數學和英文
bob.courses.add(math) # Bob 選了數學
我認為在各種後端語言相比,語法算是非常簡潔,並且將資料庫存取包裝得很好了。
作為快速開發,FastAPI 也是很多人的首選,撰寫起來也非常直觀
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
不過由於 FastAPI 是一個輕量框架,剛好沒有內建 ORM
所以如果服務要串聯資料庫,通常會需要搭配其他的 ORM 框架進行開發,像是 SQLAlchemy
SQLAlchemy 的語法就比較複雜一點了
from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, DeclarativeBase
class Base(DeclarativeBase):
pass
# 中介表 (association table)
user_course = Table(
"user_course",
Base.metadata,
Column("user_id", ForeignKey("users.id"), primary_key=True),
Column("course_id", ForeignKey("courses.id"), primary_key=True),
)
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, unique=True, index=True)
courses = relationship(
"Course",
secondary=user_course,
back_populates="users"
)
class Course(Base):
__tablename__ = "courses"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, unique=True, index=True)
users = relationship(
"User",
secondary=user_course,
back_populates="courses"
)
之前和其他人的討論中,有討論到如果同時有後端需求以及資料分析需求,由於資料分析的部分很常使用 Python 進行開發,那麼使用 Python 就會比較合理。
不過在這種場景之下,我會使用資料庫作為中介,在語言的選項具備彈性的同時,也不會讓系統變得複雜。
具體說就是,後端的部分繼續使用喜歡的語言,像是 PHP 開發。然後 Python 撰寫獨立的服務,讀取資料庫的內容進行分析。
這樣,既不用將後端服務和資料分析服務撰寫再一起,也可以同時善用兩個語言的優勢
今天的部分就說到這邊,我們明天見!